#include "chip.h"
#include "config.h"

/**
 * @brief 初始化芯片时钟
 * @param 无
 * @return 无
 */
void chip_init_clock(void)
{
    SYSCON->PCER0=0xFFFFFFF;        //PCLK Enable
    SYSCON->PCER1=0xFFFFFFF;        //PCLK Enable
    while(!(SYSCON->PCSR0&0x1));    //Wait PCLK enabled	
}

/**
 * @brief 初始化SYSCON外设
 * @param 无
 * @return 无
 */
void chip_syscon_init(void)
{
//------SYSTEM CLK AND PCLK FUNTION---------------------------/
    //SYSCON all register clr
    SYSCON_RST_VALUE();
    //SYSCON enable/disable clock source
    SYSCON_General_CMD(ENABLE,ENDIS_ISOSC);
#ifdef SYS_RTC_CLK_EXTERNAL_ENABLE
    // Enable EXT clk
    EMOSC_OSTR_Config(0XAD,0X1f,EM_LFSEL_EN,EM_FLEN_EN,EM_FLSEL_10ns);
    SYSCON_General_CMD(ENABLE,ENDIS_EMOSC);
    SYSCON->GCER |= 0x8000;
    while(!(SYSCON->GCSR&0x8000));
#endif
    SYSCON_HFOSC_SELECTE(HFOSC_SELECTE_24M);//HFOSC selected 24MHz
    //system clock set, Hclk div ,Pclk div  set system clock=SystemCLK/Hclk div/Pclk div
    SystemCLK_HCLKDIV_PCLKDIV_Config(SYSCLK_HFOSC,HCLK_DIV_1,PCLK_DIV_1,HFOSC_24M);
    //------------  WDT FUNTION  --------------------------------/
    //WDT TIME 1s,WDT alarm interrupt time=1s-1s*1/8=0.875S
    SYSCON_IWDCNT_Config(IWDT_TIME_4S,IWDT_INTW_DIV_7);
    SYSCON_WDT_CMD(DISABLE);//enable/disable WDT		
    SYSCON_IWDCNT_Reload();//reload WDT
    IWDT_Int_Enable();
    //------------  WWDT FUNTION  --------------------------------/
    WWDT_CNT_Load(0xFF);
    WWDT_CONFIG(PCLK_4096_DIV0,0xFF,WWDT_DBGDIS);
    WWDT_Int_Config(ENABLE);
    //WWDT_CMD(ENABLE);	//enable wwdt
    //------------  SYSCON Vector  --------------------------------/
    SYSCON_Int_Enable();    //SYSCON VECTOR
//------------------------------------------------------------/
//OSC CLOCK Calibration
//------------------------------------------------------------/	
    // std_clk_calib_source(CLK_ISOSC_27K);
    // std_clk_calib(CLK_HFOSC_24M);   //Select the same clock source as the system
}

/**
 * @brief 使能芯片所有通用中断
 * @param 无
 * @return 无
 */
void chip_enable_irq(void)
{
    CK_CPU_EnAllNormalIrq();
}

/**
 * @brief 关闭芯片所有通用中断
 * @param 无
 * @return 无
 */
void chip_disable_irq(void)
{
    CK_CPU_DisAllNormalIrq();
}

/**
 * @brief 使能看门狗
 * @param 无
 * @return 无
 */
void chip_wdt_enable(void)
{
    SYSCON_IWDCNT_Reload();
    SYSCON_WDT_CMD(ENABLE);
    IWDT_Int_Enable();
}

/**
 * @brief 关闭看门狗
 * @param 无
 * @return 无
 */
void chip_wdt_disable(void)
{
    SYSCON_IWDCNT_Reload();
    SYSCON_WDT_CMD(DISABLE);
	IWDT_Int_Disable();
}

/**
 * @brief 看门狗重载初始值
 * @param 无
 * @return 无
 */
void chip_wdt_feed(void)
{
    SYSCON_IWDCNT_Reload();
}

/**
 * @brief 进入低功耗模式
 * @param 无
 * @return 无
 */
void chip_deepsleep_mode(void)
{
    PCLK_goto_deepsleep_mode();
}

/**
 * @brief 软件延时
 * @param 无
 * @return 无
 */
void delay_nms(unsigned int t)
{
    volatile unsigned int i,j ,k=0;
    j = 25* t;
    for ( i = 0; i < j; i++ )
    {
        k++;
		SYSCON_IWDCNT_Reload(); 
    }
}
void delay_nus(unsigned int t)
{
    volatile unsigned int i,j ,k=0;
    j = 1* t;
    for ( i = 0; i < j; i++ )
    {
        k++;
    }
}


